// 接口
interface Person1 {
    name: string;
    age: number;
    sayHi(): void
}

// 类型别名
type Person2 = {
    name: string;
    age: number;
    sayHi(): void
}

// 接口和类型别名都能给对象指定类型
// 但是类型别名不仅仅是对象，他可以对任何类型指定别名

let person: Person1 = {
    name: 'Brave-Y',
    age: 18,
    sayHi() {
        console.log('我是胖鸡')
    }
}

// 接口--继承
interface point2D {
    x: number;
    y: number
}

interface point3D extends point2D { z: number }


// 元组
let position1: number[] = [192.168, 192.106]
let position2: [number, number] = [192.168, 192.106]

// 类型推论
// ts会根据后面的18推断age的数据类型
let age1 = 18
let age: number = 18
function add1(num1: number, num2: number): number {
    return num1 + num2
}
function add2(num1: number, num2: number) {
    return num1 + num2
}

// 类型断言
// 有的时候你会比ts更加确定这个变量的类型
// const aLink = document.getElementById('link') as HTMLAnchorElement

// 字面量类型
// direction的值只能是 'up' | 'left' | 'right' | 'down' 中的其中一个
function changeDirection1(direction: 'up' | 'left' | 'right' | 'down') {
    console.log(direction)
}
// 枚举
enum Direction { up = 1, down = 2, left = 3, right = 4 }
function changeDirection2(direction: Direction) {
    console.log(direction)
}
changeDirection2(Direction.up)

// typeof
console.log(typeof '你好，世界')
let p = { x: 1, y: 2 }
function formatPoint1(point: { x: number; y: number }) { }
formatPoint1(p)
function formatPoint2(point: typeof p) { }